var publisher = {//出版商
subscribers:{//不同杂志的订阅者数组
any : []
},
// 添加订阅这方法
subscribe:function(fn,type){//订阅是触发的方法和订阅哪个类型的
type = type || 'any';
if(typeof this.subscribers[type] === 'undefined'){//如果这个订阅类型没有,就新创建一个
this.subscribers[type] = [];
}
this.subscribers[type].push(fn);//如果已经存在了,就把订阅触发的方法加到订阅数组里面
},
// 删除订阅者
unsubscribe : function(fn,type){
this.visitSubscribers('unsubscribe',fn,type);
},
// 出版 只有发布者才能出版
publish : function(publication,type){
this.visitSubscribers('publish',publication,type);
},
//处理删除或者出版的方法
visitSubscribers : function(action,arg,type){
var pubtype = type || 'any', //调用哪个订阅者库
subscribers = this.subscribers[pubtype],//
i,
max = subscribers.length;
console.log(subscribers)
for(i=0;i<max;i++){
if(action === 'publish'){//如果是出版的话
subscribers[i](arg);
}else{
if(subscribers[i] === arg){//如果是取消订阅的话
subscribers.splice(i,1);
}
}
}
}
}
// 成为发布商
function makePublisher(o){
var i;
for(i in publisher){
if(publisher.hasOwnProperty(i) && typeof publisher[i] === 'function'){
o[i] = publisher[i];
}
}
o.subscribers = {
any : []
}
}
var paper = {
daily : function(){
this.publish('paper发行的日刊');
},
monthly : function(){
this.publish('paper发行的月刊','monthly');
}
};
makePublisher(paper); //一个发布者
var joe = {
drinkCoffee : function(paper){
console.log('我读的是' + paper);
},
sundayPreNap : function(monthly){
console.log('我读的是' + monthly);
}
}
paper.subscribe(joe.drinkCoffee);
paper.subscribe(joe.sundayPreNap,'monthly');
paper.daily();
paper.daily();
paper.daily();
paper.monthly();
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。